package clickhouse_api

import (
	"context"
	"fmt"
	"strconv"
	"time"

	"github.com/google/uuid"
)

func QueryRow() error {
	conn, err := GetNativeConnection(nil, nil, nil)
	if err != nil {
		return err
	}

	defer func() {
		conn.Exec(context.Background(), "DROP TABLE example")
	}()
	conn.Exec(context.Background(), "DROP TABLE IF EXISTS example")

	if err := conn.Exec(context.Background(), `
		CREATE TABLE example (
			  Col1 UInt8
			, Col2 String
			, Col3 FixedString(3)
			, Col4 UUID
			, Col5 Map(String, UInt8)
			, Col6 Array(String)
			, Col7 Tuple(String, UInt8, Array(Map(String, String)))
			, Col8 DateTime
		) Engine = Memory
	`); err != nil {
		return err
	}

	batch, err := conn.PrepareBatch(context.Background(), "INSERT INTO example")
	if err != nil {
		return err
	}

	for i := 0; i < 1000; i++ {
		if err := batch.Append(
			uint8(i),
			"ClickHouse",
			fmt.Sprintf("%03d", uint8(i)),
			uuid.New(),
			map[string]uint8{"key": uint8(i)},
			[]string{strconv.Itoa(i), strconv.Itoa(i + 1), strconv.Itoa(i + 2), strconv.Itoa(i + 3), strconv.Itoa(i + 4), strconv.Itoa(i + 5)},
			[]any{
				strconv.Itoa(i), uint8(i), []map[string]string{
					{"key": strconv.Itoa(i)},
					{"key": strconv.Itoa(i + 1)},
					{"key": strconv.Itoa(i + 2)},
				},
			},
			time.Now(),
		); err != nil {
			return err
		}
	}

	if err := batch.Send(); err != nil {
		return err
	}

	row := conn.QueryRow(context.Background(), "SELECT * FROM example")

	var (
		col1             uint8
		col2, col3, col4 string
		col5             map[string]uint8
		col6             []string
		col7             []any
		col8             time.Time
	)

	if err := row.Scan(&col1, &col2, &col3, &col4, &col5, &col6, &col7, &col8); err != nil {
		return err
	}

	fmt.Printf("row: col1=%d, col2=%s, col3=%s, col4=%s, col5=%v, col6=%v, col7=%v, col8=%v\n", col1, col2, col3, col4, col5, col6, col7, col8)

	return nil
}
